#-*- coding: utf-8 -*-
import sort
import random
import cpu
from displayCpu import CpuPlot

"""
def tri_bulles(t):
	stop = False
	while not stop:
		stop = True
		for i in range(len(t)-1):
			if t[i] > t[i+1]:
				t[i], t[i+1] = t[i+1], t[i]
				stop = False

def bubble_sort(t):
	tri_bulles(t)
"""

def one_bench(f, m, p, n=10):
	"""Retourne le temps pour la fonction f dans le module m"""
	return cpu.cpuTime(f, m, p, n) * 1000

def sort_random(n):
	"""
	Calcule les performances des différents algos pour 3 listes :
	- liste triée
	- liste triée dans le sens inverse
	- liste au hasard
	Une ligne de résultats est retournée.
	"""
	t1 = range(n) #sens normal
	t2 = range(n,0,-1) #sens inverse
	#liste de valeurs au hasard
	t3 = []
	for i in range(n):
		t3.append(random.randint(0,n))
	#calcul des perfs (qques constantes)
	m = 'sort'
	p1 = str(t1)
	p2 = str(t2)
	p3 = str(t3)
	#on retourne une ligne de résultats
	return [n, 
			one_bench('selection_sort', m, p1),
			one_bench('insertion_sort', m, p1),
			one_bench('merge_sort', m, p1),
			one_bench('bubble_sort', m, p1),
			one_bench('python_sort', m, p1),
			one_bench('selection_sort', m, p2),
			one_bench('insertion_sort', m, p2),
			one_bench('merge_sort', m, p2),
			one_bench('bubble_sort', m, p2),
			one_bench('python_sort', m, p2),
			one_bench('selection_sort', m, p3),
			one_bench('insertion_sort', m, p3),
			one_bench('merge_sort', m, p3),
			one_bench('bubble_sort', m, p3),
			one_bench('python_sort', m, p3)]

def affiche_graphe(data, offset, n):
	"""
	Affiche les n résultats à partir de l'offset donné.
	On considère que le nombre d'éléments se trouve à l'indice 0.
	"""
	afficheur = CpuPlot([x[0] for x in data])
	for i in range(offset, offset+n):
		afficheur.prepare([x[i] for x in data])
	afficheur.draw()

def bench():
	"""Fait tous les tests et affiche de façon textuelle et graphique."""
	#Calculs
	data = [sort_random(n) for n in range(100, 901, 100)]
	#Affichage texte
	print u"Temps affichés en millisecondes; 1=triée 2=inverse 3=random"
	print u"Couleurs utilisées : bleu vert rouge cyan magenta jaune ?"
	print u"len    s1     i1     m1     b1     p1     s2     i2     m2     b2     p2     s3     i3     m3     b3     p3"
	for r in data:
		print '%-6d' % r[0],
		for x in r[1:]:
			print '%-6.2f' % x,
		print ''
	#Affichage graphique
	affiche_graphe(data, 1, 5)
	affiche_graphe(data, 6, 5)
	affiche_graphe(data, 11, 5)



bench()
raw_input() #attendre
